package com.ruoyi.project.storage.service.impl;

import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.project.common.util.ParameterUtil;
import com.ruoyi.project.common.util.SeqGeneratorUtil;
import com.ruoyi.project.storage.domain.BoxInfo;
import com.ruoyi.project.storage.domain.BoxStandard;
import com.ruoyi.project.storage.domain.vo.BoxStandardVO;
import com.ruoyi.project.storage.mapper.BoxInfoMapper;
import com.ruoyi.project.storage.mapper.BoxStandardMapper;
import com.ruoyi.project.storage.service.IBoxStandardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 请添加注释
 *
 * @author mengyuanqing
 * @date 2020/5/7
 */
@Service
public class BoxStandardServiceImpl implements IBoxStandardService {
    // 通过注释注入
    @Autowired
    BoxInfoMapper boxInfoMapper;
    // 通过注释注入
    @Autowired
    private BoxStandardMapper boxStandardMapper;

    /**
     * 查询箱子规格列表
     *
     * @param boxStandardVO 箱子规格对象
     * @return 展示结果
     */
    @Override
    public List<BoxStandardVO> selectBoxStandardList(BoxStandardVO boxStandardVO) {
        // 返回箱子规格列表
        return boxStandardMapper.selectBoxStandardList(boxStandardVO);
    }

    /**
     * 箱子规格新增
     *
     * @param boxStandardVO 对象
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertBoxStandard(BoxStandardVO boxStandardVO) {
        // 通过箱子规格查询箱子规格信息
        BoxStandardVO boxStandardVO1 = boxStandardMapper.selectBoxStandardByStandard(boxStandardVO);
        // 判断查询到的箱子规格是否存在，如果存在只需要插入箱子信息表，如果不存在则需要插入箱子规格表的同时插入箱子信息表
        if(boxStandardVO1!=null){
            // BoxStandard的boxUnitPrice加了@NotBlank，所以不为空,如果相等的话当前箱子规格创建成功
            if(!boxStandardVO.getBoxUnitPrice().equals(boxStandardVO1.getBoxUnitPrice()));
            // 若积分单价不同抛出异常
            throw new CustomException("当前规格"+boxStandardVO.getBoxStandard()+"已存在，对应所需积分为"+boxStandardVO1.getBoxUnitPrice()+"请重新填写");
        }
        // 判断传递来的库存数量是否小于等于0
        if(boxStandardVO.getInventoryNumber()<=0L){
            // 不插入箱子信息表，也不插入箱子规格表，抛出异常
            throw new CustomException("当前规格"+boxStandardVO.getBoxStandard()+"已存在，本次无新增库存，无需重新新增");
        }

        else {
            // 设置基础字段
            ParameterUtil.setCreateEntity(boxStandardVO);
            // 新增箱子规格
            int insertCount=boxStandardMapper.insertBoxStandard(boxStandardVO);
            // 判断是否插入箱子规格到箱子规格表
            if(insertCount<=0){
                // 插入失败，抛出异常
                throw new CustomException("箱子规格插入失败，请联系管理");
            }
            // 判断传进来的库存输了是否小于等于0
            if(boxStandardVO.getInventoryNumber()<=0L){
                // 直接返回插入条数
                return insertCount;
            }
        }
        // 插入箱子信息条数
        return boxInfoMapper.batchInsertBoxInfo(initBoxInfoList(boxStandardVO));
    }

    /**
     * 根据箱子规格显示对象初始化箱子信息List
     *
     * @param boxStandardVO 箱子规格显示对象
     * @return 箱子信息List
     */
    private List<BoxInfo> initBoxInfoList(BoxStandardVO boxStandardVO) {
        // 获取当前时间
        Date date = DateUtils.getNowDate();
        // 获取当前登陆人姓名
        String userName = SecurityUtils.getUsername();
        // 初始化箱子信息List
        List<BoxInfo> list = new ArrayList<>();
        // 遍历（此处确定库存数量大于0）
        for (int i = 0;i<boxStandardVO.getInventoryNumber();i++){
            // 实例化箱子对象
            BoxInfo boxInfo = new BoxInfo();
            // 设置箱子编号年月日+六位序列，因此要转换类型
            boxInfo.setBoxCode(Long.valueOf(SeqGeneratorUtil.seqGenerator(DateUtils.getNowDateStr(),6)));
            // 设置箱子规格
            boxInfo.setBoxStandard(boxStandardVO.getBoxStandard());
            // 设置箱子积分单价
            boxInfo.setBoxUnitPrice(boxStandardVO.getBoxUnitPrice());
            // 设置未使用
            boxInfo.setIsUsed(0);
            // 设置备注
            boxInfo.setRemark(boxStandardVO.getRemark());
            // 设置创始人
            boxInfo.setCreateBy(userName);
            // 创建时间
            boxInfo.setCreateTime(date);
            // 更新人
            boxInfo.setUpdateBy(userName);
            // 更新时间
            boxInfo.setUpdateTime(date);
            // 版本号
            boxInfo.setVersion(0L);
            // 未删除
            boxInfo.setDelFlag("0");
            // 箱子示例添加到箱子信息List中
            list.add(boxInfo);
        }
        // 返回箱子信息List
        return list;
    }

    /**
     * 箱子规格删除
     *
     * @param ids 删除箱子规格Id
     * @return 结果
     */
    @Override
    public int deleteBoxStandardByIds(Long[] ids) {
        // 校验,查看当前规格下的箱子是否在箱子信息表里还有没删除的
        if (boxStandardMapper.selectBoxInfoCountByIds(ids)>0){
            // 若箱子id对应规格下仍有箱子，抛出异常
            throw  new CustomException("删除箱子规格失败，规格下仍有箱子");
        }
        // 返回修改条数
        return boxStandardMapper.deleteBoxStandardByIds(ParameterUtil.getBatchUpdateMapByIds(ids));
    }

    /**
     * 查询当前箱子规格
     *
     * @param boxStandardVO 实体
     * @return 查询结果
     */
    @Override
    public List<BoxStandardVO> selectBoxStandardEffective(BoxStandardVO boxStandardVO) {
        // 返回结果
        return boxStandardMapper.selectBoxStandardEffective(boxStandardVO);
    }

    /**
     * 查询箱子规格下拉列表
     *
     * @return 结果
     */
    @Override
    public List<BoxStandard> selectBoxStandardLowList() {
        // 返回实体
        return boxStandardMapper.selectBoxStandardSelectList();
    }


}
